package com.yuanshen.receive;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author 朱厚强
 * @version 1.0
 * @classname BasicListener
 * 默认的点对点接收模式,这个文件分为两部分，第一部分是最原始的接收方式，另外一部分是SpringAMQ的原始发送发送。
 */
//@Component
public class DefaultListener {
    /**
     * 原始方法
     * @param args
     * @throws IOException
     * @throws TimeoutException
     */
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1、建立连接
        ConnectionFactory factory = new ConnectionFactory(); // 连接工厂
        // 设置连接参数
        factory.setHost("192.168.202.5"); // RabbitMQ 主机地址
        factory.setPort(5672); // RabbitMQ 端口号
        factory.setUsername("root"); // RabbitMQ 用户名
        factory.setPassword("123456"); // RabbitMQ 密码
        factory.setVirtualHost("/"); // RabbitMQ 虚拟主机
        // 获取连接
        Connection connection = factory.newConnection();
        // 2、创建 channel(信道)
        Channel channel = connection.createChannel();
        // 3、声明队列
        String queueName = "原神"; // 队列名称
        channel.queueDeclare(queueName, false, false, false, null);

        // 4、定义消息接收的回调
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] Received '" + message + "'");
        };
        // 5、开始接收消息
        channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {});

        // 注意：在实际应用中，通常会让应用保持运行状态，以持续接收消息。
        // 例如，可以加入阻塞操作或循环。
    }

    /**
     * SpringAMQ原始方法
     * @param message
     */
    @RabbitListener(queues = "mq.basic") //核心注解 监听mq.basic这个队列
    public void receive(String message){
        System.out.println("接收message = " + message);
    }
    @RabbitListener(queues = "启动！！！")// 核心注解，监听 “启动！！！” 这个队列 ,前提是，要有这个队列。
    @RabbitListener(queuesToDeclare = @Queue("zhuhq.queue1")) // 核心注解，监听 “启动！！！” 这个队列,如果监听队列不存在,则创建。
    public void receive1(String message){
        System.out.println("receive1接收message = " + message);
    }

    @RabbitListener(queuesToDeclare = @Queue("zhuhq.queue2")) // 核心注解，监听 “启动！！！” 这个队列,如果监听队列不存在,则创建。
    public void receive2(String message){
        System.out.println("receive2接收message = " + message);
    }

}
